% Ejercicio "Juego de los N errores"
\section*{\fbox{\theejercicio} - Juego de los N errores}

En las siguientes especificaciones LEX para un int\'erprete de un subconjunto del lenguaje C se han deslizado N errores. Identifica estos errores indicando claramente la l\'{\i}nea o l\'{\i}neas en la que est\'en y proponiendo una soluci\'on que resuelva satisfactoriamente el problema.

\begin{Programa}
\item \verb@%{@
\item \verb@#include "y.tab.h"@
\item \verb@%}@
\item \verb@%Start  COMENTARIO@
\item 
\item \verb@%%@
\item \verb@\/\*                        { BEGIN COMENTARIO; }@
\item \verb@<COMENTARIO>.*              ;@
\item \verb@<COMENTARIO>\*\/            { BEGIN 0; }@
\item \verb@[a-zA-Z_][a-zA-Z0-9_]*      {@
\item \verb@                              strcpy(yylval.codigo,yytext);@
\item \verb@                              return IDENT;@
\item \verb@                            }@
\item \verb@int                         { return INTEGER; }@
\item \verb@float                       { return REAL; }@
\item \verb@char                        { return CHAR; }@
\item \verb@do                          { return DO; }@
\item \verb@while                       { return WHILE; }@
\item \verb@for                         { return FOR; }@
\item \verb@if                          { return IF; }@
\item \verb@0|[1-9][0-9]*               {@
\item \verb@                              yylval.valor = atoi(yytext);@
\item \verb@                              return NUMERO_ENTERO;@
\item \verb@                            }@
\item \verb@0\.[0-9]*                   |@
\item \verb@[1-9][0-9]*\.[0-9]*         {@
\item \verb@                              yylval.valor = atod(yytext);@
\item \verb@                              return NUMERO_REAL_SIN_EXPONENTE;@
\item \verb@                            }@
\item \verb@[0-9.]+E[+-]?[0-9]+         {@
\item \verb@                              yylval.valor = atod(yytext);@
\item \verb@                              return NUMERO_REAL_CON_EXPONENTE;@
\item \verb@                            }@
\item \verb@\".*\"                      {@
\item \verb@                              strcpy(yylval.cadena,yytext);@
\item \verb@                              return CADENA;@
\item \verb@                            }@
\item \verb@\.|\,|\:|\;|\(|\)|\+|\-|\*|\/|\{|\}   { return yytext; }@
\item \verb@<                           { return "<"; }@
\item \verb@<=                          { return "<="; }@
\item \verb@>                           { return ">"; }@
\item \verb@>=                          { return ">="; }@
\item \verb@==                          { return "=="; }@
\item \verb@!=                          { return "!="; }@
\item \verb@\n                          { ; }@
\item \verb@[\ \t]+                     ;@
\item \verb@.+                          { fprintf(yyout,"ERROR LEX: %s",yytext); }@
\item \verb@%%@
\end{Programa}

% Solución del ejercicio
\subsection*{SOLUCI\'ON}

\begin{tabular}{|c|c|p{4cm}|p{5.4cm}|} \hline
{\bf N$^\circ$} & {\bf L\'{\i}nea(s)} & {\bf Problema} & {\bf Correcci\'on} \\ \hline

\#1 & 8     & {\small Cuando se activa el contexto de comentario, esta expresi\'on se construye siempre porque corresponde a la m\'as larga} & {\small Sustituir l\'{\i}neas 7-9 por las siguientes:}
\raggedright
{\scriptsize
\smallskip

\verb@\/\*                 { BEGIN COMENTARIO; }@ \\
\verb@<COMENTARIO>\*\/     { BEGIN 0; }@ \\
\verb@<COMENTARIO>[^*\n]+  { ; }@ \\
\verb@<COMENTARIO>\*       { ; }@ \\
\verb@<COMENTARIO>\n       { ; }@ \\} \tabularnewline \hline

\#2 & 10-20 & {\small La expresi\'on regular de las palabras regulares nunca se selecciona al estar detr\'as de la de los identificadores} & {\small Las l\'{\i}neas 14-20 deben ponerse antes de la l\'{\i}nea 10} \\ \hline

\#3 & 30    & {\small La expresi\'on regular {\tt [0-9.]} corresponde a lexemas que no son n\'umeros como {\tt 12.12.12}} & \raggedright {\small Sustituir la expresi\'on regular por la siguiente:} \smallskip \\ {\footnotesize \verb@(0|[1-9][0-9]*)\.[0-9]+E[+-]?[0-9]+@} \tabularnewline \hline

\#4 & 47    & {\small La expresi\'on regular {\tt .*} se lo traga todo} & {\small Dejar solamente un punto, as\'{\i} reconoce car\'acter a car\'acter} \\ \hline

\#5 & 39-44 & {\small Los caracteres $<$ y $>$ tienen un significado especial} & {\small Hay que poner una barra antes de los caracteres $<$ y $>$} \\ \hline

\#6 & 39-44 & {\small LEX siempre debe devolver un n\'umero entero, no una cadena de caracteres} &  {\small Definir tokens para las expresiones de comparaci\'on} \\ \hline

\#7 & 34    & {\small La expresi\'on regular de las cadenas constantes no es correcta, ya que {\tt .*} recoge todo el resto de la l\'{\i}nea, incluido el fin de comentario} & {\small En primera aproximaci\'on ser\'{\i}a v\'alida la expresi\'on \verb@\[^"\n]*\"@ si no se aceptan cadenas de caracteres que incluyan el car\'acter doble comilla como, por ejemplo, \verb@"abc\"def"@} \\ \hline

\#8 & 38    & {\small LEX siempre debe devolver un n\'umero entero, no una cadena de caracteres} & {\small {\tt return yytext[0];}} \\ \hline
\end{tabular}